#include <iostream>
using namespace std;
#include "LecteurPhraseAvecArbre.h"
#include "NoeudVisitor.h"

int main(int argc, char* argv[]) {
    try { 
      char nomFich[255];
      if (argc != 2) {
	  cout << "Usage : " << argv[0] << " nom_fichier_source" << endl << endl;
	  cout << "Entrez le nom du fichier que voulez-vous interpreter : ";
	  cin.getline(nomFich, sizeof(nomFich));
      } else
	  strncpy(nomFich, argv[1], sizeof(nomFich));

      LecteurPhraseAvecArbre lp(nomFich); // on contruit l'arbre  du programme

      lp.analyse(); // on le rempli en faisant une analyse
      TypeVisitor typevisitor;
      lp.getArbre()->Accept(typevisitor); // verification des types lors des affectations, et operations binaires
      
      cout << endl << "Arbre Abstrait : " << endl;
      cout         << "================"  << endl;

      AfficherVisitor afficheVisitor;
      lp.getArbre()->Accept(afficheVisitor); // on affiche cet arbre


      cout << endl << "Table des symboles avant evaluation : " << lp.getTs(); // la table des symbole de l'arbre (valeur "direct", variable)
      cout << endl << "Evaluation de l'arbre (interpretation)..." << endl << endl << endl;;
      lp.getArbre()->getValeur(); // ici, pas de paternvisitor
      cout  << endl << endl<< endl << "Table des symboles apres evaluation : " << lp.getTs();
      cout  << endl << endl;
      cout << endl << "Conversion en C++ : " << endl;
      cout         << "================"  << endl;
      cout  << endl << endl;
      ConversionVisitor convVisitor;
      lp.getArbre()->Accept(convVisitor); // on convertie le programme en C++ en l'affichant
      cout  << endl;
      return 0;
    }
    catch (char const*) {
      return 0;
    }
}
